java产生死锁的简单例子

class Test implements Runnable
{
    private boolean flag;
    Test(boolean flag)
    {
        this.flag=flag;
    }

    public void run()
    {
        if (flag)//如果flag为ture,运行a,如果flag为false,运行B
        {
            while (true)
            {
            
            synchronized(MyLock.locka)
            {
                System.out.println("if locka");
                synchronized(MyLock.lockb)
                {
                    System.out.println("if lockb");
                }
            }
            }
        }
        else
        {
            while (true)
            {
            
            synchronized(MyLock.lockb)
            {
                System.out.println("else lockb");
                synchronized(MyLock.locka)
                {
                    System.out.println("else locka");
                }
            }
            }
        }
        
    }



    
}
class MyLock
{
    public static final Object locka=new Object();
    public static final Object lockb=new Object();
}

class deadLockTest
{
    public static void main(String[] args)
    {
        Test a=new Test(true);
        Test b=new Test(false);

        Thread t1=new Thread(a);
        Thread t2=new Thread(b);

        t1.start();
        t2.start();
    }
}

 

运行结果如下,可以看到当只有第一个线程运行时,不会产生死锁问题,当t1线程完成第一个同步,获取到locka锁,CPU扫到t2线程,t2获取到lockb锁。这时,无论CPU扫到哪个线程,都无法进行下一个同步,因为t1和t2都无法获取下一个同步所需要的锁。

 

posted on 2018-04-19 19:07  yfyfyf947  阅读(162)  评论(0编辑  收藏  举报